#pragma once

#include "application/map/lift/base_lift.h"
#include <QObject>
#include <QString>
#include <QByteArray>
#include <QHostAddress>
#include <functional>

namespace application {
namespace lift {

// TCP协议处理类
namespace hk {
    using ProtocolCallback = std::function<void(QByteArray&)>;

    class Protocol : public QObject {
        Q_OBJECT
    public:
        Protocol();
        ~Protocol();

        void init(const QHostAddress& liftIp, int liftPort, ProtocolCallback frameParse);
        void write(const QByteArray& sendData);

    signals:
        void stateChanged(QAbstractSocket::SocketState state);

    private slots:
        void receiveReadyRead();

    private:
        class TcpConnection;
        TcpConnection* m_connection{nullptr};
        QByteArray m_lastMessage;
        ProtocolCallback m_frameParse;
    };
}

// 回调函数类型
using ResponseCallback = LiftResponseCallback;

/**
 * @brief 海康电梯实现
 * @details 对应三方代码 lift.h/lift.cpp
 *
 *          协议特点：
 *          - TCP通信
 *          - 字节协议（固定5字节）
 *          - 命令格式：[cmd][subcmd][param1][param2][param3]
 *
 *          主要API：
 *          - request_lift_status() - 查询电梯状态（0x03 0x01）
 *          - request_lift_call() - 呼叫电梯（0x03 0x02）
 *          - request_lift_in_lift_close_door() - 进电梯关门（0x03 0x06）
 *          - request_lift_out_lift_close_door() - 出电梯关门（0x03 0x07）
 *          - open_front_door() - 开前门（0x03 0x03）
 *          - close_front_door() - 关前门（0x03 0x08）
 */
class HKLift : public BaseLift {
    Q_OBJECT

public:
    explicit HKLift(int liftNum,
                   const QString& liftIp,
                   int liftPort,
                   std::shared_ptr<kernel::ILogger> logger = nullptr,
                   QObject* parent = nullptr);

    ~HKLift() override = default;

    // BaseLift接口实现
    bool initialize() override;
    bool request(const LiftRequestInfo& requestInfo) override;
    bool release() override;

    // 海康电梯特有API（参考 lift.cpp）
    void requestLiftStatus(const QString& uuid, LiftResponseCallback callback) override;
    void requestLiftCall(int liftNum, int callFloor, int aimFloor, LiftResponseCallback callback) override;
    void requestLiftInLiftCloseDoor(int liftNum, LiftResponseCallback callback) override;
    void requestLiftOutLiftCloseDoor(int liftNum, LiftResponseCallback callback) override;
    void requestDoorOpen(const QString& uuid, LiftResponseCallback callback) override;
    void requestDoorClose(const QString& uuid, LiftResponseCallback callback) override;
    void openFrontDoor(const QString& uuid);
    void closeFrontDoor(const QString& uuid);
    void sendCustomData(const QString& uuid, const QByteArray& data, ResponseCallback callback);

    // 响应处理
    void responseLiftStatus(const QByteArray& payload);
    void responseLiftCall(const QByteArray& payload);
    void responseLiftInLiftCloseDoor(const QByteArray& payload);
    void responseLiftOutLiftCloseDoor(const QByteArray& payload);
    void beRequestedLiftOnCallLayer(const QByteArray& payload);
    void responseLiftOnCallLayer(int liftNum, int contentNum);
    void beRequestedLiftOnAimLayer(const QByteArray& payload);
    void responseLiftOnAimLayer(int liftNum, int contentNum);

    // 状态控制
    void changeStage(LiftStage stage);
    void taskOver();

private:
    QString m_liftIp;
    int m_liftPort;
    hk::Protocol m_protocol;
    ResponseCallback m_callback;

    QString m_dataId;
    QString m_curDataId;
    int m_resetCount{0};

    // 电梯状态（对应原 lift.h）
    uint8_t m_aimFloor{0};      // 目标楼层
    uint8_t m_callFloor{0};     // 呼叫楼层
    uint8_t m_agvNum{0};        // AGV编号
    bool m_drawerStat{false};   // 抽屉状态
    bool m_agvControl{false};   // AGV控制标志
    bool m_lockFlag{false};     // 锁定标志

    // 数据帧解析
    void frameParse(QByteArray& data);
    void handleDoorCommandAck(uint8_t command, const QByteArray& payload);
    void clearPendingCallback();
    void handleStatusTransition(int floor, int doorState);
};

} // namespace lift
} // namespace application

